package _import

import (
	"fmt"

	"github.com/xuri/excelize/v2"
)

type Handle func([][]string)

// 查看 Excel 文件中有多少个工作表
func CountSheets(f *excelize.File) (int, error) {
	// 打开 Excel 文件

	// 获取工作表列表
	sheetNames := f.GetSheetList()

	// 返回工作表的数量
	return len(sheetNames), nil
}

// 读取指定工作表的数据
func ReadSpecificSheetData(f *excelize.File, sheetIndex int) ([][]string, error) {
	// 获取工作表列表
	sheetNames := f.GetSheetList()

	// 确保索引有效
	if sheetIndex < 0 || sheetIndex >= len(sheetNames) {
		return nil, fmt.Errorf("无效的工作表索引: %d，文件中只有 %d 个工作表", sheetIndex, len(sheetNames))
	}

	// 获取指定工作表的名称
	sheetName := sheetNames[sheetIndex]

	// 获取指定工作表的所有行
	rows, err := f.GetRows(sheetName)
	if err != nil {
		return nil, fmt.Errorf("读取工作表 %s 内容失败: %v", sheetName, err)
	}

	return rows, nil
}

// 分步读取指定工作表的数据
func ReadSpecificSheetDataInChunks(
	f *excelize.File,
	sheetIndex, chunkSize int,
	processChunk Handle,
) ([][]string, error) {
	// 获取工作表列表
	sheetNames := f.GetSheetList()

	// 确保索引有效
	if sheetIndex < 0 || sheetIndex >= len(sheetNames) {
		return nil, fmt.Errorf("无效的工作表索引: %d，文件中只有 %d 个工作表", sheetIndex, len(sheetNames))
	}

	// 获取指定工作表的名称
	sheetName := sheetNames[sheetIndex]

	// 获取指定工作表的行对象
	rows, err := f.Rows(sheetName)
	if err != nil {
		return nil, fmt.Errorf("读取工作表 %s 内容失败: %v", sheetName, err)
	}
	defer rows.Close()

	chunk := make([][]string, 0)
	totalRows := 0 // 已读取的总行数

	for rows.Next() {
		// 获取当前行
		row, err := rows.Columns()
		if err != nil {
			return nil, fmt.Errorf("读取行失败: %v", err)
		}

		// 将行添加到当前块
		chunk = append(chunk, row)
		totalRows++

		// 如果达到块大小限制，处理当前块并重置
		if len(chunk) >= chunkSize {
			fmt.Printf("处理第 %d 到第 %d 行的数据...\n", totalRows-len(chunk)+1, totalRows)
			processChunk(chunk) // 处理当前块
			chunk = [][]string{}
		}
	}

	// 处理最后未完成的块
	if len(chunk) > 0 {
		fmt.Printf("处理第 %d 到第 %d 行的数据...\n", totalRows-len(chunk)+1, totalRows)
		processChunk(chunk)
	}

	fmt.Printf("总共读取了 %d 行数据\n", totalRows)
	return nil, nil
}
